home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / VObjectText.C < prev    next >
C/C++ Source or Header  |  1992-08-26  |  7KB  |  336 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "VObjectText.h"
  6. #include "Class.h"
  7. #include "TextView.h"
  8. #include "Mark.h" 
  9. #include "SortedOList.h" 
  10. #include "Invariant.h" 
  11.  
  12. static TextChanges changeRec;
  13.  
  14. InvariantChecker(VObjectText);
  15.  
  16. //------ VObjectMark -----------------------------------------------------------
  17.  
  18. NewMetaImpl(VObjectMark, VisualMark, (TP(vop)));
  19.  
  20. VObjectMark::VObjectMark(VObject *v) 
  21. {   
  22.     vop= v; 
  23. }
  24.  
  25. VObjectMark::~VObjectMark() 
  26. {
  27.     SafeDelete(vop);
  28. }
  29.  
  30. void VObjectMark::CalcExtent()
  31. {
  32.     return vop->CalcExtent();
  33. }
  34.  
  35. Point VObjectMark::GetExtent()
  36. {
  37.     return vop->GetExtent();
  38. }
  39.     
  40. int VObjectMark::Base()
  41. {
  42.     return vop->Base();
  43. }
  44.     
  45. void VObjectMark::SetContainer(VObject *cont)
  46. {
  47.     vop->SetContainer(cont);
  48.     if (cont->IsOpen())
  49.         vop->Open(); 
  50. }
  51.  
  52. void VObjectMark::Draw(Point at, Rectangle clip, Rectangle, bool border)
  53. {
  54.     vop->SetOrigin(at);
  55.     vop->DrawAll(clip, FALSE);
  56.     if (border) {
  57.         GrSetPenInk(ePatGrey50);
  58.         GrStrokeRect(vop->ContentRect());
  59.     }
  60. }
  61.  
  62. void VObjectMark::SendDown(int what, int p, void *arg)
  63. {
  64.     vop->SendDown(what, p, arg);
  65. }
  66.  
  67. bool VObjectMark::WantsInput(Point lp)
  68. {
  69.     return vop->ContainsPoint(lp);
  70. }
  71.  
  72. class Command *VObjectMark::Input(Point lp, Token &t, class Clipper *cl)
  73. {
  74.     return vop->Input(lp, t, cl);
  75. }
  76.  
  77. void VObjectMark::FreeAll()
  78. {
  79.     vop->FreeAll();
  80.     SafeDelete(vop); 
  81. }
  82.  
  83. OStream &VObjectMark::PrintOn(OStream &s) 
  84. {
  85.     VisualMark::PrintOn(s);
  86.     return s << vop SP;
  87. }
  88.  
  89. IStream &VObjectMark::ReadFrom(IStream &s) 
  90. {
  91.     VisualMark::ReadFrom(s);
  92.     return s >> vop;
  93. }
  94.  
  95. void VObjectMark::CollectParts(Collection *col)
  96. {
  97.     VisualMark::CollectParts(col);
  98.     col->Add(vop);
  99. }
  100.  
  101. //---- list to keep VisualMarks sorted according their position --------------
  102.  
  103. class VisualMarkList : public SortedObjList {
  104. public:
  105.     VisualMarkList()
  106.     { }
  107.     int CompareObjects(Object*, Object*);
  108. };
  109.     
  110. int VisualMarkList::CompareObjects(Object *op1, Object *op2)
  111. {
  112.     Mark *m1= (Mark*)op1;
  113.     Mark *m2= (Mark*)op2;
  114.     return m1->Pos() - m2->Pos();
  115. }
  116.  
  117. //----- class VObjectText ------------------------------------------------------
  118.  
  119. NewMetaImpl(VObjectText, StyledText, (TP(visualMarks), TP(tv)));
  120.  
  121. void VObjectText::ClassInvariant()
  122. {
  123.     if (GetAssertLevel() > 7)
  124.     return;
  125.     // every VisualMark is marked in the text by a cMarkChar
  126.     Iter next(visualMarks->MakeIterator());
  127.     Mark *m;
  128.     while (m= (Mark*)next())
  129.     if (CharAt(m->Pos()) != cMarkChar)
  130.         fprintf(stderr, 
  131.         "!!!VObjectText Invariant: Marks out of sync %d %c\n", m->Pos(), CharAt(m->Pos()));
  132. }
  133.  
  134. VObjectText::VObjectText()
  135. {
  136.     Init();
  137. }
  138.  
  139. VObjectText::VObjectText(int size, Font *fd, TxtParaAlign al) 
  140.                         : StyledText(size, fd, al)
  141. {
  142.     Init();
  143. }
  144.  
  145. VObjectText::VObjectText(byte *buf, int len, Font *fd, TxtParaAlign al)
  146.                         : StyledText(buf, len, fd, al)
  147. {
  148.     Init();
  149. }
  150.     
  151. void VObjectText::Init()
  152. {
  153.     visualMarks= new MarkList(TRUE, new VisualMarkList);
  154. }
  155.  
  156. VObjectText::~VObjectText()
  157. {
  158.     if (visualMarks) 
  159.     SafeDelete(visualMarks);
  160. }
  161.  
  162. void VObjectText::InitNew()
  163. {
  164.     StyledText::InitNew();
  165.     Init();
  166. }
  167.  
  168. TextView *VObjectText::GetTextView()
  169.     return tv; 
  170. }
  171.  
  172. void VObjectText::ReplaceRange(int from, int to, Text *src, int sfrom, int sto)    
  173. {
  174.     DoDelayChanges dc(this);
  175.     AssertInvariant(VObjectText);
  176.      
  177.     visualMarks->Replace(from, to, sto-sfrom);
  178.     if (src->IsKindOf(VObjectText)) { // paste the gobjects and their marks
  179.     VObjectText *vt= (VObjectText *)src;
  180.     register VisualMark *mp, *nmp;
  181.     
  182.     Iter next(vt->visualMarks->MakeIterator());
  183.     while (mp= (VisualMark*)next()) {
  184.         if (mp->pos >= sfrom && mp->pos+mp->len <= sto) {
  185.         nmp= (VisualMark*)mp->DeepClone();
  186.         if (tv)
  187.             nmp->SetContainer(tv);
  188.         nmp->pos+= from-sfrom;
  189.         visualMarks->Add(nmp);
  190.         }
  191.     }    
  192.     }    
  193.     StyledText::ReplaceRange(from, to, src, sfrom, sto);    
  194. }
  195.  
  196. void VObjectText::SetCharStyle(TxtCharProp m, int from, int to, const CharStyleSpec &st)
  197. {
  198.     register VisualMark *mp;
  199.     CharStyleChange cp;
  200.     cp.what= m;
  201.     cp.st= st;
  202.      
  203.     Iter next(visualMarks->MakeIterator());
  204.     while (mp= (VisualMark*)next()) 
  205.     if (mp->pos >= from && mp->pos+mp->len <= to) 
  206.         mp->SendDown(cIdNone, cPartCharStyleChanged, &cp);
  207.     StyledText::SetCharStyle(m, from, to, st);    
  208. }
  209.  
  210. void VObjectText::ReplaceCharStyles(RunArray *styles, int from, int to)
  211. {
  212.     StyledText::ReplaceCharStyles(styles, from, to);
  213.     register VisualMark *mp;
  214.       
  215.     Iter next(visualMarks->MakeIterator());
  216.     while (mp= (VisualMark*)next()) 
  217.     if (mp->pos >= from && mp->pos+mp->len <= to) 
  218.         mp->SendDown(cIdNone, cPartCharStyleRepl, GetCharStyle(mp->pos));
  219. }
  220.  
  221. void VObjectText::PasteVObject(VObject *vop, int from, int to) 
  222. {
  223.     VObjectMark *vm= new VObjectMark(vop);
  224.     PasteVisualMark(vm, from, to);
  225. }
  226.  
  227. void VObjectText::PasteVisualMark(VisualMark *vmp, int from, int to) 
  228. {
  229.     AssertInvariant(VObjectText);
  230.     DoDelayChanges dc(this);
  231.  
  232.     vmp->SetContainer(tv);
  233.     vmp->CalcExtent();
  234.     vmp->SendDown(0, cPartEnableLayoutCntl, 0);
  235.     tv->GetSelection(&from, &to);
  236.     vmp->ChangeMark(from, 1);
  237.     Insert(cMarkChar, from, to);
  238.     visualMarks->Add(vmp);
  239. }
  240.  
  241. void VObjectText::SetView(TextView *vp)
  242. {
  243.     Iter next(visualMarks->MakeIterator());
  244.     register VisualMark *m;
  245.     
  246.     tv= vp;
  247.     while (m= (VisualMark*) next())
  248.     m->SetContainer(vp);
  249. }
  250.  
  251. VisualMark *VObjectText::GetVisualMarkAt(int charNo)
  252. {
  253.     register VisualMark *v= 0;
  254.     Iter next(visualMarks->MakeIterator());
  255.  
  256.     while (v= (VisualMark*) next()) 
  257.     if (v->pos == charNo && v->len == 1) 
  258.         break;
  259.     return v;
  260. }
  261.     
  262. int VObjectText::FindPositionOfVObject(VObject *gop1)
  263. {
  264.     register Mark *mp;
  265.     int pos= -1;
  266.     VObject *vop= 0;
  267.     Iter next(visualMarks->MakeIterator());
  268.  
  269.     while (mp= (Mark*)next()) {
  270.     if (mp->IsKindOf(VObjectMark)) {
  271.         vop= ((VObjectMark*)mp)->GetVObject();
  272.         if (vop == gop1)
  273.         return mp->Pos();
  274.     }
  275.     }
  276.     return pos;
  277. }
  278.  
  279. byte VObjectText::GetMarkChar()
  280. {
  281.     return cMarkChar;
  282. }
  283.  
  284. VObject *VObjectText::VObjectAt(int at)
  285. {
  286.     VisualMark *vmp= GetVisualMarkAt(at);
  287.     if (vmp->IsKindOf(VObjectMark)) 
  288.         return ((VObjectMark*)vmp)->GetVObject();
  289.     return 0;
  290. }
  291.  
  292. void VObjectText::VObjectChangedSize(VObject *vop)
  293. {
  294.     int at= FindPositionOfVObject(vop);
  295.     if (at == -1)
  296.     return; //Error("VObjectChangedSize", "vobject not found");
  297.     Send(cIdNone, eTextReplaced, changeRec(at, at+1, 1));     
  298. }
  299.  
  300. Iterator *VObjectText::VisualMarksIterator()
  301. {
  302.     return visualMarks->MakeIterator();
  303. }
  304.     
  305. int VObjectText::VisualMarksCount()
  306. {
  307.     return visualMarks->Size();
  308. }
  309.     
  310. MarkList *VObjectText::GetVisualMarks()
  311. {
  312.     return visualMarks;
  313. }
  314.  
  315. OStream &VObjectText::PrintOn(OStream &s) 
  316. {
  317.     AssertInvariant(VObjectText);
  318.     StyledText::PrintOn(s);
  319.     return s << visualMarks SP;
  320. }
  321.  
  322. IStream &VObjectText::ReadFrom(IStream &s) 
  323. {
  324.     AssertInvariant(VObjectText);
  325.     StyledText::ReadFrom(s);
  326.     s >> visualMarks;
  327.     return s;
  328. }
  329.  
  330. void VObjectText::CollectParts(Collection *col)
  331. {
  332.     StyledText::CollectParts(col);
  333.     col->Add(visualMarks);
  334. }
  335.